package logica;

import java.util.Collection;
import jugador.Jugador;
import mapa.Mapa;
import unidades.Unidad;

/**
 * Clase que gestiona una partida completa
 *
 * @author Ibai
 */
public class Partida {

    private Mapa mapa;
    private Turno turno;
    private Jugador jugadorA;
    private Jugador jugadorB;
    private long fecha;
    private boolean posicionado;

    /**
     * Inicializa una nueva partida con dos jugadores y un mapa.
     * También asigna el primer turno a uno de los dos jugadores al azar.
     *
     * @param j1 El jugador A
     * @param j2 El jugador B
     * @param m El mapa de la partida
     */
    public Partida(Jugador j1, Jugador j2, Mapa m) {
        jugadorA = j1;
        jugadorB = j2;
        mapa = m;
        if (Math.random() < 0.5) {
            turno = new Turno(j1, this);
            Collection<Unidad> unidades = j2.getEquipo().getUnidades();
            for (Unidad u : unidades) {
                u.bloquear();
            }
        } else {
            turno = new Turno(j2, this);
            Collection<Unidad> unidades = j1.getEquipo().getUnidades();
            for (Unidad u : unidades) {
                u.bloquear();
            }
        }
        fecha = 0;
        posicionado = false;
    }

    /**
     * Inicializa una nueva partida con todos los atributos.
     * @param mapa
     * @param turno
     * @param jugadorA
     * @param jugadorB
     * @param fecha
     */
    public Partida(Mapa mapa, Turno turno, Jugador jugadorA, Jugador jugadorB, long fecha) {
        setMapa(mapa);
        setTurno(turno);
        setJugadorA(jugadorA);
        setJugadorB(jugadorB);
        setFecha(fecha);
        posicionado = false;
    }

    /**
     * Devuelve el jugador A
     *
     * @return El jugador A
     */
    public Jugador getJugadorA() {
        return jugadorA;
    }

    /**
     * Establece un nuevo jugador A
     *
     * @param jugadorA El nuevo jugador A
     */
    public void setJugadorA(Jugador jugadorA) {
        this.jugadorA = jugadorA;
    }

    /**
     * Devuelve el jugador B
     *
     * @return El jugador B
     */
    public Jugador getJugadorB() {
        return jugadorB;
    }

    /**
     * Establece un nuevo jugador B
     *
     * @param jugadorB El nuevo jugador B
     */
    public void setJugadorB(Jugador jugadorB) {
        this.jugadorB = jugadorB;
    }

    /**
     * Devuelve el mapa actual en esta partida
     *
     * @return El mapa de esta partida
     */
    public Mapa getMapa() {
        return mapa;
    }

    /**
     * Establece el mapa para esta partida
     *
     * @param mapa El nuevo mapa para la partida
     */
    public void setMapa(Mapa mapa) {
        this.mapa = mapa;
    }

    /**
     * Devuelve el turno actual en la partida
     *
     * @return El turno en la partida
     */
    public Turno getTurno() {
        return turno;
    }

    /**
     * Establece un nuevo turno en la partida
     *
     * @param turno El nuevo turno
     */
    public void setTurno(Turno turno) {
        this.turno = turno;
    }

    /**
     * Devuelve la fecha de la partida
     * @return
     */
    public long getFecha() {
        return fecha;
    }

    /**
     * Establece un nuevo turno en la partida
     * @param fecha
     */
    public void setFecha(long fecha) {
        this.fecha = fecha;
    }

    /**
     * Establece que en esta partida ya se han posicionado todas las unidades
     */
    public void setPosicionado() {
        posicionado = true;
    }

    /**
     * Devuelve si las unidades ya han sido posicionadas
     * 
     * @return true si las unidades ya estan colocadas en el mapa
     */
    public boolean getPosicionado() {
        return posicionado;
    }
}
